home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / drdobbs / 1987 / 03 / shammas.lst < prev    next >
File List  |  1987-02-06  |  19KB  |  602 lines

  1. Listing 1. CHANGE.BAS Utility to search/replace text in a number of files.
  2.  
  3. 1000 ' Batch Find/Replace Utility  Version 1.0  10/29/86
  4. 1005 ' IBM PC                  BASICA version 2 or later
  5. 1010 ' Copyright (c) 1987  Namir Clement Shammas
  6. 1020 DEFINT A-Z
  7. 1030 DIM FILENAME$(20),STRNG$(30),REPLACE(30),REPLACE$(30),L$(500)
  8. 1040 TRUE  = 1
  9. 1050 FALSE = 0
  10. 1060 MAX.LINES = 500 ' Current maximum number of lines read from a file
  11. 1900 CLS
  12. 1910 T$ = "BATCH FILE FIND/REPLACE PROGRAM" : GOSUB 8000
  13. 1920 PRINT
  14. 1930 T$ = "VERSION 1.0" : GOSUB 8000
  15. 1940 PRINT : PRINT
  16. 2000 GOSUB 5000 ' Get filenames
  17. 2010 GOSUB 6000 ' Get strings
  18. 2030 FOR IFILE = 1 TO NUM.FILES
  19. 2060     GOSUB 7000 ' Read text lines from file
  20. 2070     FOR I = 1 TO NUM.STRINGS
  21. 2080         FOUND = FALSE
  22. 2090         FOR J = 1 TO NUM.LINES
  23. 2100             PTR = INSTR(L$(J),STRNG$(I))
  24. 2110             WHILE PTR > 0 
  25. 2120                 IF (FOUND = TRUE) THEN 2150
  26. 2130                     FOUND = TRUE
  27. 2140                     LPRINT "KEYWORD : ";STRNG$(I)
  28. 2150                 B$ = STR$(J) + ":"
  29. 2153                 OFFSET = LEN(B$)
  30. 2155                 LPRINT J;":";L$(J)
  31. 2160                 LPRINT SPC(PTR+OFFSET);"^"
  32. 2170                 IF (REPLACE(I) = FALSE) THEN 2240
  33. 2180                     FIRST$ = ""
  34. 2190                     IF PTR > 1 THEN FIRST$ = MID$(L$(J),1,(PTR-1))
  35. 2200                     LAST$ = ""
  36. 2210                     IF (PTR+LEN(STRNG$(I))) => LEN(L$(J)) THEN 2230
  37. 2220                         LAST$ = MID$(L$(J),(PTR+LEN(STRNG$(I))))
  38. 2230                     L$(J) = FIRST$ + REPLACE$(I) + LAST$
  39. 2231                     LPRINT "BECOMES" : LPRINT 
  40. 2233                     LPRINT J;":";L$(J) : LPRINT : LPRINT
  41. 2240                 PTR = INSTR(PTR+1,L$(J),STRNG$(I))
  42. 2250            WEND
  43. 2260        NEXT J
  44. 2270    NEXT I
  45. 2275    GOSUB 9000 ' Write file back
  46. 2277    LPRINT : LPRINT
  47. 2280 NEXT IFILE
  48. 2290 LPRINT CHR$(140) ' FORM FEED
  49. 3000 END '---------------------------------------------------------
  50. 5000 ' Subroutine to input filenames from the keyboard
  51. 5010 NUM.FILES = 0
  52. 5020 WHILE NUM.FILES <= 0
  53. 5030     INPUT "Enter number of files ";NUM.FILES
  54. 5040     PRINT 
  55. 5050 WEND
  56. 5060 FOR I = 1 TO NUM.FILES
  57. 5070    PRINT "Enter filename # ";I;" ";
  58. 5080    INPUT FILENAME$(I) : PRINT 
  59. 5090    IF FILENAME$(I) = "" THEN 5070
  60. 5100 NEXT I
  61. 5110 RETURN 
  62. 6000 ' Subroutines to inpur search/replace strings
  63. 6010 NUM.STRINGS = 0
  64. 6020 WHILE NUM.STRINGS <= 0
  65. 6030     INPUT "Enter number of search/replace strings ";NUM.STRINGS
  66. 6040     PRINT 
  67. 6050 WEND
  68. 6060 FOR I = 1 TO NUM.STRINGS
  69. 6065     REPLACE$(I) = ""
  70. 6070     PRINT : PRINT "For string # ";I
  71. 6080     INPUT "    Enter string ";STRNG$(I)
  72. 6090     INPUT "    R)eplace F)ind ";A$
  73. 6100     IF (INSTR("Rr",MID$(A$,1,1)) = 0) THEN REPLACE(I) = FALSE ELSE REPLACE(I) = TRUE
  74. 6110     IF REPLACE(I) = FALSE THEN 6125
  75. 6120     INPUT "    Enter replacement string ";REPLACE$(I)
  76. 6125 PRINT
  77. 6130 NEXT I
  78. 6140 RETURN 
  79. 7000 ' Subroutines to read text lines
  80. 7003 LPRINT "PROCESSING FILE : ";FILENAME$(IFILE)
  81. 7006 OPEN "I",1,FILENAME$(IFILE)
  82. 7010 NUM.LINES = 0
  83. 7020 WHILE (NOT EOF(1)) AND (NUM.LINES <= MAX.LINES)
  84. 7030    NUM.LINES = NUM.LINES + 1
  85. 7040    LINE INPUT#1,L$(NUM.LINES)
  86. 7050 WEND
  87. 7060 CLOSE #1
  88. 7070 RETURN  
  89. 8000 ' Subroutine to center a message
  90. 8010 PRINT SPC(40 - LEN(T$)/2);T$
  91. 8020 RETURN 
  92. 9000 'Subroutine to write the updated file
  93. 9010 OPEN "O",1,FILENAME$(IFILE)
  94. 9020 FOR I = 1 TO NUM.LINES
  95. 9030    PRINT#1,L$(I)
  96. 9040 NEXT I
  97. 9050 CLOSE#1
  98. 9060 RETURN
  99.  
  100. Listing 2. CHNG1.TRU the version of True BASIC CHANGE.BAS produced by the
  101. BASIC-Converter.
  102.  
  103. 10 ! This program converted from the Microsoft Advanced Basic
  104. 11 ! language on the IBM PC to the True BASIC language.
  105. 12 !
  106. 13 ! Convertor copyright (c) 1985 by:
  107. 14 !      True BASIC, Inc.
  108. 15 !      Hanover, NH  03755
  109. 16 !      All rights reserved.
  110. 17 !
  111. 18 ! True BASIC makes no warranty, expressed or implied, that
  112. 19 ! this converted program is a precise and accurate equivalent
  113. 20 ! of the original BasicA program.  This conversion is provided
  114. 21 ! only as an aid to a complete conversion by the owner of the
  115. 22 ! program being converted.
  116. 23 !
  117. 24 LIBRARY "deflib"
  118. 25 DECLARE DEF csrlin, oef, fre, hex$, inkey$, loc, lof
  119. 26 DECLARE DEF mki$, mks$, cvi, cvs, oct$, csr_pos, val_a, err, erl
  120. 27 
  121. 28 DEF Eof (f)
  122. 29    IF end #f then LET eof = -1 else LET eof = 0
  123. 30 END DEF
  124. 31 
  125. 32 DEF Loc (f)
  126. 33    ASK #f: record T_ARG1
  127. 34    LET t_arg1 = -int(-(t_arg1-1)/128)
  128. 35    IF t_arg1 = 0 then let loc = 1 else let loc = t_arg1
  129. 36 END DEF
  130. 37 
  131. 38 DEF Lof (f)
  132. 39    ASK #f: filesize T_ARG1
  133. 40    LET lof = t_arg1
  134. 41 END DEF
  135. 42 
  136. 43 OPTION BASE 0
  137. 44 
  138. 1000 ! Batch Find/Replace Utility  Version 1.0  10/29/86
  139. 1005 ! IBM PC                  BASICA version 2 or later
  140. 1010 ! Copyright (c) 1987  Namir Clement Shammas
  141. 1020 !  defint A-Z
  142. 1030 dim filename$(20), strng$(30), replace(30), replace$(30), l$(500)
  143. 1040 let true = 1
  144. 1050 let false = 0
  145. 1060 let max__lines = 500   ! Current maximum number of lines read from a file
  146. 1900 clear
  147. 1910 let t$ = "BATCH FILE FIND/REPLACE PROGRAM"
  148. 1911 gosub 8000
  149. 1920 print 
  150. 1930 let t$ = "VERSION 1.0"
  151. 1931 gosub 8000
  152. 1940 print 
  153. 1941 print 
  154. 1945 OPEN #9 : PRINTER
  155. 2000 gosub 5000   ! Get filenames
  156. 2010 gosub 6000   ! Get strings
  157. 2030 for ifile = 1 to num__files
  158. 2060 gosub 7000   ! Read text lines from file
  159. 2070 for i = 1 to num__strings
  160. 2080 let found = false
  161. 2090 for j = 1 to num__lines
  162. 2100 let ptr = pos(l$(j),strng$(i))
  163. 2110 do while ptr > 0
  164. 2120 if (found = true) then goto 2150
  165. 2130 let found = true
  166. 2140 print #9 : "KEYWORD : ";STRNG$(I)
  167. 2150 let b$ = str$(j) & ":"
  168. 2153 let offset = round(len(b$))
  169. 2155 print #9 :  J;":";L$(J)
  170. 2160 print #9 :  REPEAT$(" ",(PTR+OFFSET+1));"^" ! Manual fix on this line
  171. 2170 if (replace(i) = false) then goto 2240
  172. 2180 let first$ = ""
  173. 2190 if ptr > 1 then let first$ = (l$(j))[1:1+(ptr-1)-1]
  174. 2200 let last$ = ""
  175. 2210 if (ptr+len(strng$(i))) => len(l$(j)) then goto 2230
  176. 2220 let last$ = (l$(j))[(ptr+len(strng$(i))):maxnum]
  177. 2230 let l$(j) = first$ & replace$(i) & last$
  178. 2231 print #9 :  "BECOMES"
  179. 2232 print #9 :
  180. 2233 print #9 :  J;":";L$(J)
  181. 2234 print #9 :
  182. 2235 print #9 :
  183. 2240 let ptr = pos(l$(j),strng$(i),ptr+1)
  184. 2250 loop
  185. 2260 next j
  186. 2270 next i
  187. 2275 gosub 9000   ! Write file back
  188. 2277 print #9 :
  189. 2278 print #9 :
  190. 2280 next ifile
  191. 2290 print #9 :  CHR$(140)   ! FORM FEED
  192. 3000 stop   !---------------------------------------------------------
  193. 5000 ! Subroutine to input filenames from the keyboard
  194. 5010 let num__files = 0
  195. 5020 do while num__files <= 0
  196. 5030 input prompt "Enter number of files ": num__files
  197. 5040 print 
  198. 5050 loop
  199. 5060 for i = 1 to num__files
  200. 5070 print "Enter filename # "; i; " "; 
  201. 5080 input filename$(i)
  202. 5081 print 
  203. 5090 if filename$(i) = "" then goto 5070
  204. 5100 next i
  205. 5110 return
  206. 6000 ! Subroutines to inpur search/replace strings
  207. 6010 let num__strings = 0
  208. 6020 do while num__strings <= 0
  209. 6030 input prompt "Enter number of search/replace strings ": num__strings
  210. 6040 print 
  211. 6050 loop
  212. 6060 for i = 1 to num__strings
  213. 6065 let replace$(i) = ""
  214. 6070 print 
  215. 6071 print "For string # "; i
  216. 6080 input prompt "    Enter string ": strng$(i)
  217. 6090 input prompt "    R)eplace F)ind ": a$
  218. 6100 if (pos("Rr",(a$)[1:1]) = 0) then let replace(i) = false else let replace(i) = true
  219. 6110 if replace(i) = false then goto 6125
  220. 6120 input prompt "    Enter replacement string ": replace$(i)
  221. 6125 print 
  222. 6130 next i
  223. 6140 return
  224. 7000 ! Subroutines to read text lines
  225. 7003 print #9 :  "PROCESSING FILE : ";FILENAME$(IFILE)
  226. 7006 open #1: name filename$(ifile), access input, create old
  227. 7010 let num__lines = 0
  228. 7020 do while ((not eof(1) <> 0)) and (num__lines <= max__lines)
  229. 7030 let num__lines = num__lines+1
  230. 7040 line input #1:l$(num__lines) ! Manual fix here
  231. 7050 loop
  232. 7060 close  #1
  233. 7070 return
  234. 8000 ! Subruotine to center a message
  235. 8010 print tab(csr_pos+40-len(t$)/2); t$
  236. 8020 return
  237. 9000 !Subroutine to write the updated file
  238. 9010 open #1: name filename$(ifile), access output, create old
  239. 9015 erase #1 ! this line is added
  240. 9020 for i = 1 to num__lines
  241. 9030 print #1:l$(i)
  242. 9040 next i
  243. 9050 close #1 
  244. 9060 return
  245. 9061 end
  246.  
  247.  
  248. Listing 3. CHNG2.TRU the True BASIC version of CHANGE.BAS that is
  249. translated manually.
  250.  
  251. ! Batch Find/Replace Utility  Version 1.0  10/29/86
  252. ! IBM PC                  True BASIC version 1
  253. ! Copyright (c) 1987  Namir Clement Shammas
  254. DIM FILENAME$(20),STRNG$(30),REPLACE(30),REPLACE$(30),L$(500)
  255. LET TRUE  = 1
  256. LET FALSE = 0
  257. LET MAX_LINES = 500 ! Current maximum number of lines read from a file
  258. CLEAR ! Clear screen
  259. CALL CenterText("BATCH FILE FIND/REPLACE PROGRAM")
  260. PRINT
  261. CALL CenterText("VERSION 1.0")
  262. PRINT
  263. PRINT
  264. OPEN #9 : PRINTER
  265. CALL GetFile(FILENAME$, NUM_FILES) ! Get filenames
  266. CALL GetStrings(STRNG$,REPLACE$,REPLACE,NUM_STRINGS) ! Get strings
  267. FOR IFILE = 1 TO NUM_FILES
  268.    CALL ReadLines(L$,FILENAME$,IFILE, NUM_LINES) ! Read text lines from file
  269.    FOR I = 1 TO NUM_STRINGS
  270.       LET FOUND = FALSE
  271.       FOR J = 1 TO NUM_LINES
  272.          LET PTR = POS(L$(J),STRNG$(I))
  273.          DO WHILE PTR > 0
  274.            IF (FOUND = FALSE) THEN
  275.               LET FOUND = TRUE
  276.               PRINT #9 :  "KEYWORD : ";STRNG$(I)
  277.            END IF
  278.            LET B$ = STR$(J) & ":" ! Use & to concatenate strings
  279.            LET OFFSET = LEN(B$)
  280.            PRINT #9 :  J;":";L$(J)
  281.            PRINT #9 :  REPEAT$(" ",(PTR+OFFSET+1));"^"
  282.            IF (REPLACE(I) = TRUE) THEN
  283.               LET FIRST$ = ""
  284.               IF PTR > 1 THEN LET FIRST$ = L$(J)[1:(PTR-1)]
  285.               LET LAST$ = ""
  286.               IF (PTR+LEN(STRNG$(I))) < LEN(L$(J)) THEN
  287.                  LET LAST$ = L$(J)[(PTR+LEN(STRNG$(I))):LEN(L$(J))]
  288.               END IF
  289.               LET L$(J) = FIRST$ & REPLACE$(I) & LAST$
  290.               PRINT #9 :  "BECOMES" 
  291.               PRINT #9 : 
  292.               PRINT #9 :  J;":";L$(J) 
  293.               PRINT #9 :  
  294.               PRINT #9 : 
  295.            END IF
  296.            LET PTR = POS(L$(J),STRNG$(I),(PTR+1))
  297.          LOOP
  298.       NEXT J
  299.    NEXT I
  300.    CALL WriteLines(L$,FILENAME$,REPLACE,IFILE,NUM_LINES)
  301.    ! Write file back
  302.    PRINT #9 :  
  303.    PRINT #9 : 
  304. NEXT IFILE
  305. PRINT #9 : CHR$(140) ! FORM FEED
  306.  
  307. SUB GetFile(FILENAME$(), NUM_FILES) 
  308. ! Subroutine to input filenames from the keyboard
  309. LET NUM_FILES = 0
  310. DO WHILE NUM_FILES <= 0
  311.    INPUT PROMPT "Enter number of files ":NUM_FILES
  312.    PRINT 
  313. LOOP
  314. FOR I = 1 TO NUM_FILES
  315.    LET FILENAME$(I) = ""
  316.    DO WHILE FILENAME$(I) = ""
  317.       PRINT "Enter filename # ";I;" ";
  318.       INPUT FILENAME$(I) 
  319.       PRINT
  320.    LOOP
  321. NEXT I
  322. END SUB
  323.  
  324. SUB GetStrings(STRNG$(),REPLACE$(),REPLACE(),NUM_STRINGS) 
  325. ! Subroutines to inpur search/replace strings
  326. LET NUM_STRINGS = 0
  327. DO WHILE NUM_STRINGS <= 0
  328.    INPUT PROMPT "Enter number of search/replace strings ":NUM_STRINGS
  329.    PRINT 
  330. LOOP
  331. FOR I = 1 TO NUM_STRINGS
  332.    LET REPLACE$(I) = ""
  333.    PRINT 
  334.    PRINT "For string # ";I
  335.    INPUT PROMPT "    Enter string ":STRNG$(I)
  336.    INPUT PROMPT "    R)eplace F)ind ":A$
  337.    IF (POS("Rr",A$[1:1]) = 0) THEN
  338.       LET REPLACE(I) = FALSE
  339.    ELSE
  340.       LET REPLACE(I) = TRUE
  341.       INPUT PROMPT "    Enter replacement string ":REPLACE$(I)
  342.    END IF
  343.    PRINT
  344. NEXT I
  345. END SUB
  346.  
  347. SUB ReadLines(L$(),FILENAME$(),INDEX,NUM_LINES) 
  348. ! Subroutines to read text lines
  349. PRINT #9 :  "PROCESSING FILE : ";FILENAME$(INDEX)
  350. OPEN #1 : NAME FILENAME$(INDEX), ORGANIZATION TEXT, ACCESS INPUT, CREATE OLD     
  351. LET NUM_LINES = 0
  352. DO WHILE MORE #1 
  353.    LET NUM_LINES = NUM_LINES + 1
  354.    LINE INPUT#1 : L$(NUM_LINES)
  355. LOOP
  356. CLOSE #1
  357. END SUB
  358.  
  359. SUB CenterText(T$) 
  360. ! Subroutine to center a message
  361. PRINT REPEAT$(" ",(40 - LEN(T$)/2));T$
  362. END SUB
  363.  
  364. SUB WriteLines(L$(),FILENAME$(),INDEX,NUM_LINES) 
  365. !Subroutine to write the updated file
  366. OPEN #1 : NAME FILENAME$(INDEX), ORGANIZATION TEXT, ACCESS OUTPUT, CREATE OLD
  367. ERASE #1
  368. FOR I = 1 TO NUM_LINES
  369.    PRINT#1 : L$(I)
  370. NEXT I
  371. CLOSE#1
  372. END SUB
  373.  
  374. END
  375.  
  376.  
  377. Listing 4. CHNG1.BAS the first QuickBASIC version of CHANGE.BAS that is
  378. translated manually.
  379.  
  380. ' Batch Find/Replace Utility  Version 1.0  10/29/86
  381. ' IBM PC                  QuickBASIC version 2
  382. ' Copyright (c) 1987  Namir Clement Shammas
  383. DEFINT A-Z
  384. DIM FILENAME$(20),STRNG$(30),REPLACE(30),REPLACE$(30),L$(500)
  385. TRUE  = 1
  386. FALSE = 0
  387. MAX.LINES = 500 ' Current maximum number of lines read from a file
  388. CLS
  389. T$ = "BATCH FILE FIND/REPLACE PROGRAM" : GOSUB Center
  390. PRINT
  391. T$ = "VERSION 1.0" : GOSUB Center
  392.      PRINT : PRINT
  393.      GOSUB GetFile ' Get filenames
  394.      GOSUB GetStrings ' Get strings
  395.      FOR IFILE = 1 TO NUM.FILES
  396.      GOSUB ReadLines ' Read text lines from file
  397.          FOR I = 1 TO NUM.STRINGS
  398.              FOUND = FALSE
  399.              FOR J = 1 TO NUM.LINES
  400.                  PTR = INSTR(L$(J),STRNG$(I))
  401.                  WHILE PTR > 0 
  402.              IF (FOUND = FALSE) THEN
  403.                          FOUND = TRUE
  404.              LPRINT "KEYWORD : ";STRNG$(I)
  405.              END IF
  406.              B$ = STR$(J) + ":"
  407.                      OFFSET = LEN(B$)
  408.                      LPRINT J;":";L$(J)
  409.                      LPRINT SPC(PTR+OFFSET);"^"
  410.              IF (REPLACE(I) = TRUE) THEN
  411.              FIRST$ = ""
  412.                          IF PTR > 1 THEN FIRST$ = MID$(L$(J),1,(PTR-1))
  413.                          LAST$ = ""
  414.              IF (PTR+LEN(STRNG$(I))) < LEN(L$(J)) THEN
  415.                  LAST$ = MID$(L$(J),(PTR+LEN(STRNG$(I))))
  416.              END IF
  417.              L$(J) = FIRST$ + REPLACE$(I) + LAST$
  418.                          LPRINT "BECOMES" : LPRINT 
  419.              LPRINT J;":";L$(J) : LPRINT : LPRINT
  420.              END IF
  421.              PTR = INSTR(PTR+1,L$(J),STRNG$(I))
  422.                 WEND
  423.             NEXT J
  424.         NEXT I
  425.     GOSUB WriteLines ' Write file back
  426.         LPRINT : LPRINT
  427.      NEXT IFILE
  428.      LPRINT CHR$(140) ' FORM FEED
  429.      END '---------------------------------------------------------
  430. GetFile: ' Subroutine to input filenames from the keyboard
  431.      NUM.FILES = 0
  432.      WHILE NUM.FILES <= 0
  433.          INPUT "Enter number of files ";NUM.FILES
  434.          PRINT 
  435.      WEND
  436.      FOR I = 1 TO NUM.FILES
  437.     FILENAME$(I) = ""
  438.     WHILE FILENAME$(I) = ""
  439.        PRINT "Enter filename # ";I;" ";
  440.        INPUT FILENAME$(I) : PRINT
  441.     WEND
  442.      NEXT I
  443.      RETURN 
  444. GetStrings: ' Subroutines to inpur search/replace strings
  445.      NUM.STRINGS = 0
  446.      WHILE NUM.STRINGS <= 0
  447.          INPUT "Enter number of search/replace strings ";NUM.STRINGS
  448.          PRINT 
  449.      WEND
  450.      FOR I = 1 TO NUM.STRINGS
  451.          REPLACE$(I) = ""
  452.          PRINT : PRINT "For string # ";I
  453.          INPUT "    Enter string ";STRNG$(I)
  454.          INPUT "    R)eplace F)ind ";A$
  455.          IF (INSTR("Rr",MID$(A$,1,1)) = 0) THEN REPLACE(I) = FALSE ELSE REPLACE(I) = TRUE
  456.      IF REPLACE(I) = TRUE THEN
  457.          INPUT "    Enter replacement string ";REPLACE$(I)
  458.      END IF
  459.      PRINT
  460.      NEXT I
  461.      RETURN 
  462. ReadLines: ' Subroutines to read text lines
  463.      LPRINT "PROCESSING FILE : ";FILENAME$(IFILE)
  464.      OPEN "I",1,FILENAME$(IFILE)
  465.      NUM.LINES = 0
  466.      WHILE (NOT EOF(1)) AND (NUM.LINES <= MAX.LINES)
  467.         NUM.LINES = NUM.LINES + 1
  468.         LINE INPUT#1,L$(NUM.LINES)
  469.      WEND
  470.      CLOSE #1
  471.      RETURN  
  472. Center:  ' Subroutine to center a message
  473.      PRINT SPC(40 - LEN(T$)/2);T$
  474.      RETURN 
  475. WriteLines: 'Subroutine to write the updated file
  476.      OPEN "O",1,FILENAME$(IFILE)
  477.      FOR I = 1 TO NUM.LINES
  478.         PRINT#1,L$(I)
  479.      NEXT I
  480.      CLOSE#1
  481.      RETURN
  482.  
  483. Listing 5. CHNG2.BAS the second QuickBASIC version of CHANGE.BAS that is
  484. translated manually.
  485.  
  486. ' Batch Find/Replace Utility  Version 1.0  10/29/86
  487. ' IBM PC                  QuickBASIC version 2
  488. ' Copyright (c) 1987  Namir Clement Shammas
  489. DEFINT A-Z
  490. DIM FILENAME$(20),STRNG$(30),REPLACE(30),REPLACE$(30),L$(500)
  491. TRUE  = 1
  492. FALSE = 0
  493. MAX.LINES = 500 ' Current maximum number of lines read from a file
  494. CLS
  495. CALL CenterText("BATCH FILE FIND/REPLACE PROGRAM")
  496. PRINT
  497. CALL CenterText("VERSION 1.0")
  498. PRINT : PRINT
  499. CALL GetFile(FILENAME$(), NUM.FILES) ' Get filenames
  500. CALL GetStrings(STRNG$(),REPLACE$(),REPLACE(),NUM.STRINGS) ' Get strings
  501. FOR IFILE = 1 TO NUM.FILES
  502.    ' Read text lines from file
  503.    CALL ReadLines(L$(),FILENAME$(),IFILE, NUM.LINES)
  504.    FOR I = 1 TO NUM.STRINGS
  505.       FOUND = FALSE
  506.       FOR J = 1 TO NUM.LINES
  507.      PTR = INSTR(L$(J),STRNG$(I))
  508.      WHILE PTR > 0
  509.        IF (FOUND = FALSE) THEN
  510.           FOUND = TRUE
  511.           LPRINT "KEYWORD : ";STRNG$(I)
  512.        END IF
  513.        B$ = STR$(J) + ":"
  514.        OFFSET = LEN(B$)
  515.        LPRINT J;":";L$(J)
  516.        LPRINT SPC(PTR+OFFSET);"^"
  517.        IF (REPLACE(I) = TRUE) THEN
  518.           FIRST$ = ""
  519.           IF PTR > 1 THEN FIRST$ = MID$(L$(J),1,(PTR-1))
  520.           LAST$ = ""
  521.           IF (PTR+LEN(STRNG$(I))) < LEN(L$(J)) THEN
  522.          LAST$ = MID$(L$(J),(PTR+LEN(STRNG$(I))))
  523.           END IF
  524.           L$(J) = FIRST$ + REPLACE$(I) + LAST$
  525.           LPRINT "BECOMES" : LPRINT
  526.           LPRINT J;":";L$(J) : LPRINT : LPRINT
  527.        END IF
  528.        PTR = INSTR(PTR+1,L$(J),STRNG$(I))
  529.      WEND
  530.       NEXT J
  531.     NEXT I
  532.     ' Write file back
  533.     CALL WriteLines(L$(),FILENAME$(),REPLACE(),IFILE,NUM.LINES)
  534.     LPRINT : LPRINT
  535. NEXT IFILE
  536. LPRINT CHR$(140) ' FORM FEED
  537. END '---------------------------------------------------------
  538.  
  539. SUB GetFile(FILENAME$(1), NUM.FILES) STATIC
  540. ' Subroutine to input filenames from the keyboard
  541.      NUM.FILES = 0
  542.      WHILE NUM.FILES <= 0
  543.          INPUT "Enter number of files ";NUM.FILES
  544.          PRINT 
  545.      WEND
  546.      FOR I = 1 TO NUM.FILES
  547.     FILENAME$(I) = ""
  548.     WHILE FILENAME$(I) = ""
  549.        PRINT "Enter filename # ";I;" ";
  550.        INPUT FILENAME$(I) : PRINT
  551.     WEND
  552.      NEXT I
  553. END SUB
  554.  
  555. SUB GetStrings(STRNG$(1),REPLACE$(1),REPLACE(1),NUM.STRINGS) STATIC
  556. ' Subroutines to inpur search/replace strings
  557.      NUM.STRINGS = 0
  558.      WHILE NUM.STRINGS <= 0
  559.          INPUT "Enter number of search/replace strings ";NUM.STRINGS
  560.          PRINT 
  561.      WEND
  562.      FOR I = 1 TO NUM.STRINGS
  563.          REPLACE$(I) = ""
  564.          PRINT : PRINT "For string # ";I
  565.          INPUT "    Enter string ";STRNG$(I)
  566.          INPUT "    R)eplace F)ind ";A$
  567.      IF (INSTR("Rr",MID$(A$,1,1)) = 0) THEN
  568.         REPLACE(I) = FALSE
  569.      ELSE
  570.         REPLACE(I) = TRUE
  571.         INPUT "    Enter replacement string ";REPLACE$(I)
  572.      END IF
  573.      PRINT
  574.      NEXT I
  575. END SUB
  576.  
  577. SUB ReadLines(L$(1),FILENAME$(1),INDEX,NUM.LINES) STATIC
  578. ' Subroutines to read text lines
  579.      LPRINT "PROCESSING FILE : ";FILENAME$(INDEX)
  580.      OPEN "I",1,FILENAME$(INDEX)
  581.      NUM.LINES = 0
  582.      WHILE (NOT EOF(1)) ' AND (NUM.LINES <= MAX.LINES)
  583.         NUM.LINES = NUM.LINES + 1
  584.         LINE INPUT#1,L$(NUM.LINES)
  585.      WEND
  586.      CLOSE #1
  587. END SUB
  588.  
  589. SUB CenterText(T$) STATIC
  590. ' Subroutine to center a message
  591.      PRINT SPC(40 - LEN(T$)/2);T$
  592. END SUB
  593.  
  594. SUB WriteLines(L$(1),FILENAME$(1),INDEX,NUM.LINES) STATIC
  595. ' Subroutine to write the updated file
  596.      OPEN "O",1,FILENAME$(INDEX)
  597.      FOR I = 1 TO NUM.LINES
  598.         PRINT#1,L$(I)
  599.      NEXT I
  600.      CLOSE#1
  601. END SUB
  602.